package com.example.firstapp.KtLesson

fun main() {
    //with 在连续调用同一个对象的多个方法时让代码变得更加精简
    // 参数1 任意类
    // 参数2 lambda 最后一行作为返回值
    val list = listOf("cln","ligna","k2a")
    val builder = StringBuilder()
    builder.append("happinesss is \n")
    for (i in list){
        builder.append(i).append("\n")
    }
    println(builder.toString())
    // 改为用with
    // 给with函数的第一个参数传入了一个StringBuilder对象
    // 接下来整个Lambda表达式的上下文就会是这个StringBuilder对象
    val result1 = with(StringBuilder()){
        append("happinesss is")
        for (i in list){
            append(i).append("\n")
        }
        toString()
    }
    println(result1)

    // run
    // run函数通常不会直接调用,而是要在某个对象的基础上调用；
    // 函数只接收一个Lambda参数，并且会在Lambda表达式中提供调用对象的上下文
    // 最后一行作为返回值
    val result2 = StringBuilder().run{
        append("happinesss is")
        for (i in list){
            append(i).append("\n")
        }
        toString()
    }
    println(result2)

    // apply
    // 在某个对象上调用，并且只接收一个Lambda参数
    // 也会在Lambda表达式中提供调用对象的上下文
    // apply函数无法指定返回值，而是会自动返回调用对象本身
    val result3 = StringBuilder().apply {
        append("happinesss is")
        for (i in list){
            append(i).append("\n")
        }
    }
    println(result3)

}
